POSIX 共有メモリ
POSIX 共有メモリ(POSIX shared memory)
code:posix_shared_memory.c
#define SHARED_MEM_NAME "/posix_shared_mem" /**
* @brief 共有メモリを作成して初期化します。
*
* この関数は、指定された名前とサイズで共有メモリオブジェクトを作成し、
* ファイルディスクリプタを返します。
*
* @return 共有メモリのファイルディスクリプタ
*/
int create_shared_memory() {
int fd = shm_open(SHARED_MEM_NAME, O_CREAT | O_RDWR, 0666);
if (fd == -1) {
perror("shm_open");
exit(EXIT_FAILURE);
}
if (ftruncate(fd, SHARED_MEM_SIZE) == -1) {
perror("ftruncate");
exit(EXIT_FAILURE);
}
return fd;
}
/**
* @brief 共有メモリにデータを書き込みます。
*
* 指定されたファイルディスクリプタに対応する共有メモリにデータを書き込みます。
*
* @param fd 共有メモリのファイルディスクリプタ
* @param message 書き込むメッセージ
*/
void write_to_shared_memory(int fd, const char *message) {
void *ptr = mmap(NULL, SHARED_MEM_SIZE, PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
snprintf((char *)ptr, SHARED_MEM_SIZE, "%s", message);
if (munmap(ptr, SHARED_MEM_SIZE) == -1) {
perror("munmap");
exit(EXIT_FAILURE);
}
}
/**
* @brief 共有メモリからデータを読み込みます。
*
* 指定されたファイルディスクリプタに対応する共有メモリからデータを読み込み、標準出力に表示します。
*
* @param fd 共有メモリのファイルディスクリプタ
*/
void read_from_shared_memory(int fd) {
void *ptr = mmap(NULL, SHARED_MEM_SIZE, PROT_READ, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
printf("Read from shared memory: %s\n", (char *)ptr);
if (munmap(ptr, SHARED_MEM_SIZE) == -1) {
perror("munmap");
exit(EXIT_FAILURE);
}
}
/**
* @brief 共有メモリを削除します。
*
* この関数は、指定された名前の共有メモリオブジェクトを削除します。
*/
void delete_shared_memory() {
if (shm_unlink(SHARED_MEM_NAME) == -1) {
perror("shm_unlink");
exit(EXIT_FAILURE);
}
}
/**
* @brief プログラムのエントリーポイントです。
*
* この関数は、親プロセスと子プロセス間で共有メモリを使用してメッセージをやり取りします。
*
* @return 正常終了時は0を返します。
*/
int main() {
int fd = create_shared_memory();
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) { // 子プロセス
sleep(1); // 親プロセスが書き込むまで待つ
read_from_shared_memory(fd);
} else { // 親プロセス
write_to_shared_memory(fd, "Hello from parent process!");
wait(NULL); // 子プロセスの終了を待つ
delete_shared_memory();
}
close(fd);
return 0;
}
確認用
Q. POSIX 共有メモリ
関連
メモ
調査用
Wikipedia.icon
Wikipedia.icon